package main

import (
	"fmt"
	"math"
)

// a) 扩展 interfaces_poly.go 中的例子，添加一个 Circle 类型
// b) 使用一个抽象类型 Shape（没有字段） 实现同样的功能，它实现接口 Shaper，然后在其他类型里内嵌此类型。扩展 10.6.5 中的例子来说明覆写。

type Shaper interface {
	Area() float32
}

type Square struct {
	side float32
}

func (s Square) Area() float32 {
	return s.side * s.side
}

type Rectangle struct {
	x, y float32
}

func (r Rectangle) Area() float32 {
	return r.x * r.y
}

type Circle struct {
	r float32
}

func (c Circle) Area() float32 {
	return math.Pi * c.r * c.r
}

func main() {
	var areaIntf Shaper
	sq := Square{5.55}

	areaIntf = sq
	// 接收者为copy而不是pointer
	if t, ok := areaIntf.(Square); ok {
		fmt.Printf("The Type of areaIntf is: %T\n", t)
	}
	if t, ok := areaIntf.(*Square); ok {
		fmt.Printf("The Type of areaIntf is: %T\n", t)
	}
	if u, ok := areaIntf.(Circle); ok {
		fmt.Printf("The Type of areaIntf is: %T\n", u)
	} else {
		fmt.Println("areaIntf dones not contain a variable of Circle")
	}
}
